package com.shlh.saas.service.facebook;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shlh.saas.entity.facebook.FacebookUser;
import com.shlh.saas.model.dto.FacebookQueryDTO;

import java.util.List;
import java.util.Map;

/**
 * Facebook用户服务接口
 */
public interface FacebookUserService extends IService<FacebookUser> {
    
    /**
     * 分页查询Facebook联系人
     * 
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    Page<FacebookUser> getFacebookDataPage(FacebookQueryDTO queryDTO);

    /**
     * 根据数据表和Facebook ID获取联系人详情
     *
     * @param mysqlTable 数据表名
     * @param id Facebook ID
     * @return Facebook联系人信息
     */
    FacebookUser getFacebookDetailByTableAndId(String mysqlTable, String id);

    /**
     * 两阶段查询：企业+姓名匹配邮箱
     * 第一阶段：ES查询获取mysqlTable和id
     * 第二阶段：MySQL精确查询获取完整信息
     *
     * @param firstName 名字
     * @param lastName 姓氏
     * @param workplace 工作地点
     * @return Facebook联系人信息
     */
    FacebookUser matchByNameAndWorkplaceTwoStage(String firstName, String lastName, String workplace);

    /**
     * 两阶段查询：企业+姓名匹配手机号
     *
     * @param firstName 名字
     * @param lastName 姓氏
     * @param workplace 工作地点
     * @return Facebook联系人信息
     */
    FacebookUser matchPhoneByNameAndWorkplaceTwoStage(String firstName, String lastName, String workplace);

    /**
     * 两阶段查询：姓名+邮箱匹配手机号
     *
     * @param firstName 名字
     * @param lastName 姓氏
     * @param email 邮箱
     * @return Facebook联系人信息
     */
    FacebookUser matchPhoneByNameAndEmailTwoStage(String firstName, String lastName, String email);

    /**
     * 两阶段查询：手机号+姓名匹配邮箱
     *
     * @param phoneNumber 手机号
     * @param firstName 名字
     * @param lastName 姓氏
     * @return Facebook联系人信息
     */
    FacebookUser matchEmailByPhoneAndNameTwoStage(String phoneNumber, String firstName, String lastName);
    
    /**
     * 导出Facebook联系人数据
     * 
     * @param queryDTO 查询参数
     * @return 导出的数据列表
     */
    List<FacebookUser> exportFacebookData(FacebookQueryDTO queryDTO);

    
    /**
     * 使用筛选条件搜索Facebook联系人
     * 
     * @param queryDTO 查询参数DTO，包含关键词和筛选条件
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 符合条件的数据列表
     */
    Page<FacebookUser> searchWithFilters(FacebookQueryDTO queryDTO, int offset, int limit);

    
    /**
     * 获取搜索建议
     * 
     * @param keyword 关键词
     * @return 搜索建议列表
     */
    List<String> getSuggestions(String keyword);
    
    /**
     * 获取符合条件的Facebook数据数量
     * 
     * @param queryDTO 查询参数
     * @return 符合条件的记录数
     */
    long countFacebookData(FacebookQueryDTO queryDTO);

    /**
     * 根据姓名和工作地点匹配邮箱
     * 用于企业+姓名匹配邮箱模式
     */
    FacebookUser matchByNameAndWorkplace(String firstName, String lastName, String workplace);

    /**
     * 根据姓名和工作地点匹配手机号
     * 用于企业+姓名匹配手机号模式
     */
    FacebookUser matchPhoneByNameAndWorkplace(String firstName, String lastName, String workplace);

    /**
     * 根据姓名和邮箱匹配手机号
     * 用于姓名+邮箱匹配手机号模式
     */
    FacebookUser matchPhoneByNameAndEmail(String firstName, String lastName, String email);

    /**
     * 根据手机号和姓名匹配邮箱
     * 用于手机号+姓名匹配邮箱模式
     */
    FacebookUser matchEmailByPhoneAndName(String phoneNumber, String firstName, String lastName);

    Map<String, List<String>> getFacebookMapList();

    // ==================== 导出功能两阶段查询方法 ====================

    /**
     * 两阶段查询：导出Facebook联系人数据
     * 第一阶段使用ES快速检索，第二阶段使用MySQL批量查询完整数据
     *
     * @param queryDTO 查询参数
     * @return Facebook联系人数据列表
     */
    List<FacebookUser> exportFacebookDataTwoStage(FacebookQueryDTO queryDTO);

    /**
     * 两阶段查询：获取导出数据总数（用于前端显示和分页）
     *
     * @param queryDTO 查询参数
     * @return 匹配记录总数
     */
    long getExportDataCountTwoStage(FacebookQueryDTO queryDTO);

    /**
     * 两阶段查询：分页导出Facebook联系人数据
     * 支持大数据量的分页导出，避免内存溢出
     *
     * @param queryDTO 查询参数
     * @param pageNum 页码（从1开始）
     * @param pageSize 每页大小
     * @return Facebook联系人数据列表
     */
    List<FacebookUser> exportFacebookDataTwoStageWithPagination(FacebookQueryDTO queryDTO, int pageNum, int pageSize);

    List<FacebookUser> searchFacebookUsersWithEmail(String searchKeyword, int offset, int size);

    Long countFacebookUsersWithEmail(String searchKeyword);

    List<FacebookUser> searchFacebookUsersWithPhone(String searchKeyword, int offset, int size);

    Long countFacebookUsersWithPhone(String searchKeyword);

    List<FacebookUser> findByEmail(String searchEmail);

    List<FacebookUser> findByPhone(String phone);

    List<Map<String, Object>> searchByEmail(String email, int size, int offset);

    List<Map<String, Object>> searchByPhone(String value, int size, int offset);

    long countByEmail(String email);

    long countByPhone(String value);

    List<String> searchCurrent(String current);

    List<String> searchHometown(String hometowm);

    List<String> searchWorkplaces(String workplace);

    List<FacebookUser> searchFacebookData(String companyName, String fullName, Integer matchType);


}
